<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>面向对象 - JavaScript</title>
</head>
<body>
    <h1>面向对象</h1>

    <h4>学习目标</h4>
    <ol>
        <li>需要逐步了解和应用面向对象的思想</li>
        <li>熟悉JavaScript中创建类和实例化的语法</li>
        <li>了解JavaScript的原型链</li>
    </ol>

    <script type="text/javascript">

        // --------------------------------------------------------------------
        // -- 面向对象
        // --------------------------------------------------------------------


        // --------------------------------------------------------------------
        // -- 面向对象
        // --------------------------------------------------------------------
        /*
            面向对象  (Object Oriented,OO) 的思想对软件开发相当重要，它的概念和应用甚至已超越了程序设计和软件开发，
            扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD 技术、人工智能等领域。
            面向对象是一种 对现实世界理解和抽象的方法，是计算机编程技术发展到一定阶段后的产物。
        */

        // ----------------------------------------------------
        // -- 语法
        // ----------------------------------------------------

        // -----------------------------
        // 1. 类（class）
        // -----------------------------
        /*
            在面向对象编程中，类（class）是对象（object）的模板，定义了同一组对象（又称”实例”）共有的属性和方法。

            在es5中，用function关键词声明。
            声明语法:
                function 类名([属性1, 属性2, ...]) {
                    代码块
                }
                注：属性可选，可以不传属性，也可以传入若干个属性
                注：类中可以 this 这个关键词表示当前对象
                注：类名首字母用大写

             new实例语法：
                new 类名([属性1, 属性2, ...]);
         */
        // 1.1 声明一个学生对象，有姓名、性别、生日字段
        // 1.2 再次声明一个学生对象，有姓名、性别、生日字段，值和上面的不一样。
        // 1.3 计算上面两个学生对象的年龄
        // 1.4 声明一个学生类，需要传入名称、性别、生日
        // 1.5 在上面的类的基础上，增加获取名称、获取性别、获取年龄的方法
        // 1.6 方法(method)和函数(function)的区别？
        // 1.7 在上面类的基础上，增加设置名称，设置性别，设置生日的方法
        // 1.8 对象、实例、类是什么？instanceof 运算符
        // 1.9 什么是属性和方法？
        // 1.10 this关键词表示什么？
        // 1.11 构造方法是什么？
        // 1.12 通过set方法来设置，和构造方法直接传属性有什么不一样的？
        // 1.13 使用 instanceof 运算符判断学生对象是否是学生类的实例。


        // -----------------------------
        // 2. 继承（extends）
        // -----------------------------
        /*
            继承性是子类自动共享父类数据结构和方法的机制，这是类之间的一种关系。在定义和实现一个类的时候，可以在一个已经存在的类的基础之上来进行，把这个已经存在的类所定义的内容作为自己的内容，并加入若干新的内容。

            大部分语言继承都是用extends关键词，ES5中没有extends关键词，使用原型链的方式。

            在 JavaScript 中，每个对象都有一个指向它的原型（prototype）对象的内部链接。这个原型对象又有自己的原型，直到某个对象的原型为 null 为止（也就是不再有原型指向），组成这条链的最后一环。这种一级一级的链结构就称为原型链（prototype chain）。

            原型链实际上在定义一个对象的时候原型链本身就已经生成了，如果一个对象某个属性找不到，会沿着它的原型往上去寻找，直到原型链的最后才会停止寻找。

            语法:
                子类.prototype = new 父类();
         */
        // 2.1 声明计应班学生类，有姓名、性别、生日、php分数属性，有相关set和get方法，有获取年龄的方法
        // 2.2 声明软件班学生类，有姓名、性别、生日、asp.net分数属性，有相关set和get方法，有获取年龄的方法
        // 2.3 观察一下上面的两个类是不是和学生类的东西大量重复了？
        // 2.4 改写计应班学生类，继承上例学生类
        // 2.5 改写软件班学生类，继承上例学生类
        // 2.6 查看计应班学生类、软件班学生类原型链
        // 2.7 使用 instanceof 运算符 查看计应班和软件班的学生实例是否是学生类的实例？
        // 2.8 分别声明数字对象、字符串对象、布尔对象、数组、对象，查看其原型链


        // -----------------------------
        // 3. 多态（Polymorphism）
        // -----------------------------
        /*
            多态（Polymorphism）按字面的意思就是“多种状态”。在面向对象语言中，接口的多种不同的实现方式即为多态。

            实现多态通常会重写（override）父类的方法。
         */
        // 3.1. 参考上面学生的类Student，定义学习的方法，输出：学习软件编程技术
        // 3.2. 计应班的同学学习是LNMP，在计应班学生类重写学习方法，输出：学习LNMP
        // 3.3. 软件班的同学学习是asp.net，在软件班学生类重写学习方法，输出：学习asp.net
        // 3.4. 方法和函数的区别？



        // -----------------------------
        // 4. 重载（overload）
        // -----------------------------
        /*
            js没有严格意义的重载
         */


        // -----------------------------
        // 5. 接口（interface）
        // -----------------------------
        /*
            js没有严格意义的接口
         */


        // -----------------------------
        // 6. es6中的语法
        // -----------------------------
        /*
            es6中增加了class的语法糖，本质是根据上面实现的。
            语法：
                class 类名 {
                    constructor(属性1, 属性2, ...) {
                        构造方法体
                    }

                    方法1名(参数1, 参数2, ...) {
                        方法体
                    }
                    方法2名(参数1, 参数2, ...) {
                        方法体
                    }
                    ...
                }
                注：类里声明方法，不用加function
                注：类里可以声明多个方法
         */
        // 6.1 使用新语法糖实现上面的学生类、计应班学生类、软件班学生类
        // 6.2 新语法糖和旧的用哪个？

        // -----------------------------
        // 7. 面向对象思想在数据库表结构设计的应用
        // -----------------------------
        // 7.1 回顾一下数据库课程的学生管理系统的表设计, 思考和类、对象是否有一点相通的感觉?


        // ----------------------------------------------------
        // -- 练习
        // ----------------------------------------------------
        // 1. 声明一个动物类，有名称属性，有睡觉方法。
        // 2. 声明一个斑马类，继承动物类，重写睡觉方法。
        // 3. 声明一个鱼类，继承动物类，重写睡觉方法。
        // 4. 声明一个鸟类，继承动物类，重写睡觉方法。
        // 5. 声明一个人类，继承动物类，重写睡觉方法。
        // 6. 参考网页新闻内容页, 需要设计哪些对象?


    </script>
</body>
</html>